package com.ruoyi.ManagerApi.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.ruoyi.ManagerApi.domain.TTpApi;
import com.ruoyi.ManagerApi.domain.TTpApiSet;
import com.ruoyi.ManagerApi.domain.TTpManufacturer;
import com.ruoyi.ManagerApi.mapper.TTpApiMapper;
import com.ruoyi.ManagerApi.mapper.TTpApiSetMapper;
import com.ruoyi.ManagerApi.mapper.TTpManufacturerMapper;
import com.ruoyi.ManagerApi.service.HomeService;
import com.ruoyi.ManagerApi.vo.GetDataVo;
import com.ruoyi.common.core.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Service
public class HomeServiceImpl implements HomeService {
    @Autowired
    private TTpApiMapper tTpApiMapper;
    @Autowired
    private TTpManufacturerMapper tTpManufacturerMapper;
    @Autowired
    private TTpApiSetMapper tTpApiSetMapper;
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public String selectHomeLeftTop(GetDataVo getDataVo) {
        try {
            // 1. 获取接口配置
            TTpApi api = tTpApiMapper.selectTTpApiById(String.valueOf(getDataVo.getPathId()));
            if (api == null) {
                throw new ServiceException("接口不存在");
            }
            // 2. 获取厂家信息
            TTpManufacturer manufacturer = tTpManufacturerMapper.selectTTpManufacturerById(String.valueOf(api.getTtpMid()));
            if (manufacturer == null) {
                throw new ServiceException("厂家不存在");
            }
            //2.1如果厂家的路径填的为mysql时,直接就使用mysql查询语句执行数据库然后返回结果
            if ("mysql".equals(manufacturer.getTokenUrl())) {
                //使用mysql语句直接查询
                return jdbcTemplate.queryForList(getDataVo.getParameters()).toString();
            }
            // 3. 获取接口详细配置
            TTpApiSet apiSet = tTpApiSetMapper.selectApiSetByApiType(String.valueOf(api.getId()));
            if (apiSet == null) {
                throw new ServiceException("接口配置不存在");
            }
            //3.1如果厂家的路径填的为mysql时,直接就使用mysql查询语句执行数据库然后返回结果
            if ((manufacturer.getTokenUrl() != null && manufacturer.getTokenUrl().contains("HIK"))) {
                //使用海康专属接口请求,如果是post或者get使用不同的请求
                // 解析 token_json 中的配置
                JSONObject tokenJson = JSON.parseObject(manufacturer.getTokenJson());
                String appKey = tokenJson.getString("appkey");
                String secret = tokenJson.getString("secret");
                String ip = tokenJson.getString("ip");
                int port = tokenJson.getIntValue("port");
                // 构建ArtemisConfig
                ArtemisConfig config = new ArtemisConfig();
                config.setHost(ip + ":" + port);
                config.setAppKey(appKey);
                config.setAppSecret(secret);
                final String getCamsApi = api.getUrlPath();
                String body = "";
                //三元表达式如果getDataVo.getParameters()存在，否则用apiSet.getParameter()
                if (getDataVo.getParameters() != null) {
                    body = JSON.toJSON(getDataVo.getParameters()).toString();
                } else {
                    body = JSON.toJSON(apiSet.getParameter()).toString();
                }
                Map<String, String> path = new HashMap<String, String>(2) {
                    {
                        put("https://", getCamsApi);
                    }
                };
                if (Objects.equals(apiSet.getMethod(), "POST")) {
                    String response = ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
                    System.out.println(response);
                    // 处理API响应
                    JSONObject stats = processCameraStats(response);
                    System.out.println(stats);
                    return String.valueOf(stats);
                } else if (Objects.equals(apiSet.getMethod(), "GET")) {
                    String response = ArtemisHttpUtil.doGetArtemis(config, path, null, null, null);
                    // 处理API响应
                    JSONObject stats = processCameraStats(response);
                    System.out.println(stats);
                    return String.valueOf(stats);
                }
            }
        } catch (Exception e) {
            throw new ServiceException("调用接口失败");

        }
        return "";
    }
    public static JSONObject processCameraStats(String jsonData) {
        JSONObject result = new JSONObject();
        try {
            // 解析JSON数据
            JSONObject jsonObject = JSON.parseObject(jsonData);
            JSONObject data = jsonObject.getJSONObject("data");
            // 获取总数
            int total = data.getIntValue("total");
            result.put("total", total);
            // 获取摄像头列表
            JSONArray list = data.getJSONArray("list");
            // 统计在线和离线数量
            int onlineCount = 0;
            int offlineCount = 0;
            for (int i = 0; i < list.size(); i++) {
                JSONObject camera = list.getJSONObject(i);
                int onlineStatus = getOnlineStatus(camera);
                if (onlineStatus == 1) {
                    onlineCount++;
                } else {
                    offlineCount++;
                }
            }
            // 计算完好率
            double intactRate = total > 0 ? (double) onlineCount / total : 0.0;
            // 添加统计结果
            result.put("online", onlineCount);
            result.put("offline", offlineCount);
            result.put("intactRatePercentage", String.format("%.2f%%", intactRate * 100));
        } catch (Exception e) {
            result.put("error", "数据处理失败: " + e.getMessage());
        }
        return result;
    }

    /**
     * 获取摄像头的在线状态
     * 优先使用onlineStatus字段，如果为0则检查extendJson中的isOnline字段
     */
    private static int getOnlineStatus(JSONObject camera) {
        // 首先检查onlineStatus字段
        if (camera.containsKey("onlineStatus")) {
            int onlineStatus = camera.getIntValue("onlineStatus");
            // 如果onlineStatus为1，直接返回在线
            if (onlineStatus == 1) {
                return 1;
            }
            // 如果onlineStatus为0，继续检查extendJson
        }
        // 检查extendJson字段
        if (camera.containsKey("extendJson")) {
            try {
                String extendJsonStr = camera.getString("extendJson");
                // 处理extendJson中的转义字符
                extendJsonStr = extendJsonStr.replace("\\\"", "\"");
                JSONObject extendJson = JSON.parseObject(extendJsonStr);
                if (extendJson.containsKey("isOnline")) {
                    return extendJson.getIntValue("isOnline");
                }
            } catch (Exception e) {
                // 忽略解析错误
            }
        }
        // 默认返回离线状态
        return 0;
    }
}
